package util;

import java.io.IOException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 
 * servlet的工具类
 * BaseServlet
 * 基础的serlvet ，继承了HttpServlet
 *        
 */
@SuppressWarnings("serial")
public class BaseServlet extends HttpServlet {
	@Override
	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");//婢跺嫮鎮婇崫宥呯安缂傛牜鐖�
		
		/**	
		 * 1. 当我们的其他Servlet继承了此基础servlet时，我们会在服务中，先调用基础servlet中的service（）接口
		 * 2.获得我们要查找的方法名； 通过反射机制调用此方法；
		 */
		String methodName = request.getParameter("method");
		Method method = null;
		
		try {
			//获得对应Servlet中的method;
			method = this.getClass().getMethod(methodName,
					HttpServletRequest.class, HttpServletResponse.class);
		} catch (Exception e) {
			throw new RuntimeException("在servlet用反射调用方法名的时候出错，方法名为：" + methodName , e);
		}
		
		
		try {
			//调用方法，并得到结果集；
			String result = (String)method.invoke(this, request, response);
			if(result != null && !result.trim().isEmpty()) {//对结果集进行判断，不等于空和去掉空不为空
				int index = result.indexOf(":");//返回的结果集中有没有：
				if(index == -1) {//如果没有：  ，就用forward;
					request.getRequestDispatcher(result).forward(request, response);
				} else {//如果有：
					String start = result.substring(0, index);//：前的字符；
					String path = result.substring(index + 1);//：后的字符
					if(start.equals("f")) {//：前的字符如果为f ,用forword;
						request.getRequestDispatcher(path).forward(request, response);
					} else if(start.equals("r")) {//:前的字符如果为r，用redirect;
						response.sendRedirect(request.getContextPath() + path);
					}
				}
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}